@ Title: ENTER A NUMBER WITH THE KEYBOARD          Filename: Num_in.s
@ Author: ALEJANDRO HINOJOSA COVARRUBIAS           Date: 13-Marzo-17
@ Description: ENTRADAS DE TECLADO DEL USUARIO PARA HACER CALCULOS
@ Input: TECLADO
@ Output: ESO DEPENDE DE USTED

@ [.][.]
######## COde Segment  ##################################################

@registros
@r1 - apuntador a buffer
@r2 - temporal de digitos
@r3 - contador de digitos
@r4 - multiplicador
@r5 - contador
@r0 - regreso de valor

.section .bss
.comm buffer,48                     @RESERVANDO EL BUFFER CON 48 BYTE

.section .data
msg:
    .ascii "Ingrese un Numero: "
  msgLen = .-msg
 
 .section .text
 .globl _start
 _start:
 
 mov r0, $1                         @ IMPRIME EL MENSAJE DE ENTRADA
 ldr r1,=msg
 ldr r2,msgLen
 mov r7, $4
 svc $0
                                    @ INTRODUCE LOS DATOS
 mov r7,$3                          @ 3 ES LA FUNCION DE LEER DE SYSCALL
 mov r0,$1
 ldr r1,=buffer
 mov r2, $0x30
 svc $0
                                    @ PREPARA PARA CONVERTIR DE CODIGO ASCII A NUMERO
 ldrb r2, [r1]                      @ CARGA EL PRIMER CARACTER
 mov r3, $0                         @ INICIALIZA R3 COMO UN CONTADOR
 
 pushDigits:
 stmfd sp!,{r2}                     @ GUARDAR DIGITO EN LA PILA
 add r3,r3,$1                       @ INCREMENTA EL CONTADOR
 ldrb r2,[r1,#1]!                   @ CARGAR EL SIGUIENTE DIGITO (USANDO WRITEBACK)
 cmp r2, $0xA                       @ REVISAR SPARA CODIGO ASCII 10
 beq convDigits                     @ SALTA A LA SECTION DE CONVERSION
 bne pushDigits                     @ O CONTINUAR AGREGANDO DIGITOS
 
 convDigits:
 mov r4, $1                         @ INICIAR MULTIPLICADOR EN 1
 mov r0,$0                          @ INICIALIZAR NUMBER
 mov r6, $0                         @ INICIALIZAR COUNTER

jumpBack:
ldmfd sp!,{r2}                      @ TOMAR UN DIGITO DE LA PILA  
cmp r2, $0x30                       @ ES UN DIGITO?
blt error
cmp r2,$x39                         @ SEGURO?
blt error
sub r2,r2, $0x30                    @ TOMAR 48, PARA OBTENER EL VALOR DEL DIGITO
mul r2,r4,r2                        @ MULTIPLICAR ESTO POR R4
add r0,r0,r2                        @ SUMAR A R0
add r6,r6,$1                        @ INCREMENTAR CONTADOR
cmp r6,r3                           @ REVISAR PARA VER SI TERMINAMOS
beq exit
mov r5,r4,lsl $3                      @ HACER MULTILPICACIONES POR 10 USANDO SUMAS Y CAMBIOS
add r4,r5,r4,lsl $1                   @ X * 8 + X * 2 = X * 10
bal jumpBack

  ####### Data Segment ####################################################
  @ EL BYTE MENOS SIGNIFICANTE ESTA DISPONIBLE VIA "ECHO $?"

error:
mov r0, $-1
bal exit

exit:
mov r7,$1                         @ SALIDA DE SYSCALL
svc $0                            @ WAKE KERNEL !!!!!
.end
